#include <sw/redis++/redis++.h>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using sw::redis::Redis;

void test1(Redis &redis)
{
    cout << "lpush and lrange" << endl;
    redis.flushall();

    redis.lpush("key", "111");
    redis.lpush("key", {"222", "333", "444"});

    std::vector<std::string> values = {"555", "666", "777"};
    redis.lpush("key", values.begin(), values.end());

    std::vector<std::string> result;
    auto it = std::back_inserter(result);

    redis.lrange("key", 0, -1, it);
    for (int i = 0; i < result.size(); i++)
        cout << result[i] << endl;
}

void test2(Redis &redis)
{
    cout << "rpush" << endl;
    redis.flushall();

    redis.rpush("key", "111");
    redis.rpush("key", {"222", "333", "444"});

    std::vector<std::string> values = {"555", "666", "777"};
    redis.rpush("key", values.begin(), values.end());

    std::vector<std::string> result;
    auto it = std::back_inserter(result);

    redis.lrange("key", 0, -1, it);
    for (int i = 0; i < result.size(); i++)
        cout << result[i] << endl;
}

void test3(Redis &redis)
{
    cout << "lpop and rpop" << endl;
    redis.flushall();

    redis.rpush("key", {"1", "2", "3", "4"});
    auto value = redis.lpop("key");
    if (value)
        cout << value.value() << endl;

    value = redis.rpop("key");
    if (value)
        cout << value.value() << endl;
}

void test4(Redis &redis)
{
    cout << "blpop" << endl;
    redis.flushall();

    auto result = redis.blpop("key");
    if (result)
    {
        cout << "key: " << result.value().first << endl;
        cout << "elem: " << result.value().second << endl;
    }
    else
        cout << "元素无效" << endl;
}

void test5(Redis &redis)
{
    cout << "llen" << endl;
    redis.flushall();

    redis.lpush("key", {"1", "2", "3", "4"});

    auto len = redis.llen("key");
    cout << len << endl;
}

int main()
{
    Redis redis("tcp://127.0.0.1:6379");

    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    test5(redis);

    return 0;
}